-- CA11016.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--      Check that a child of a non-generic package can be a private generic 
--      package. Check that the private child instance can use its parent's
--      declarations and operations.  Check that the body of a public child 
--      package can instantiate its sibling private generic package.
--
-- TEST DESCRIPTION:
--      Declare a map abstraction in a package which manages basic physical
--      map[s].  Declare a private generic child of this package which can be
--      instantiated for any display device which has display locations of 
--      the physical map that can be characterized by any integer type, i.e., 
--      the intensity of the display point.
--
--      Declare a public child of the physical map which specifies the 
--      display device.  In the body of this child, declare an instance of 
--      its generic sibling to display the geographic locations.
--
--      In the main program, check that the operations in the parent, public 
--      child and instance of the private child package perform as expected.  
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      17 Apr 96   SAIC    ACVC 2.1: Added pragma Elaborate.
--
--!

-- Simulates map of physical features, i.e., desert, forest, or water.

package CA11016_0 is              
   type Map_Type is private;
   subtype Latitude is integer range 1 .. 9;
   subtype Longitude is integer range 1 .. 7;

   type Physical_Features is (Desert, Forest, Water);
   
   -- Use geographic database to initialize the basic map.

   procedure Initialize_Basic_Map (Map  : in out Map_Type);

   function Get_Physical_Feature (Lat  : Latitude;
                                  Long : Longitude;
                                  Map  : Map_Type) return Physical_Features;

private
   type Map_Type is array (Latitude, Longitude) of Physical_Features;
   Basic_Map : Map_Type;

end CA11016_0;

     --==================================================================--

package body CA11016_0 is              

   procedure Initialize_Basic_Map (Map : in out Map_Type) is
   -- Not a real initialization.  Real application can use geographic
   -- database to create the basic map.

   begin
      for I in Latitude'first .. Latitude'last loop
         for J in 1 .. 2 loop
            Map (I, J) := Desert;
         end loop;
         for J in 3 .. 4 loop
            Map (I, J) := Forest;
         end loop;
         for J in 5 .. 7 loop
            Map (I, J) := Water;
         end loop;
      end loop;

   end Initialize_Basic_Map;
   --------------------------------------------------------
   function Get_Physical_Feature (Lat  : Latitude;
                                  Long : Longitude;
                                  Map  : Map_Type) 
     return Physical_Features is
   begin
     return (Map (Lat, Long));
   end Get_Physical_Feature;
   --------------------------------------------------------

   begin
      -- Initialize a basic map.
      Initialize_Basic_Map (Basic_Map);

end CA11016_0;

     --==================================================================--

-- Private generic child package of physical map.  This generic package may
-- be instantiated for any display device which has display locations 
-- (latitude, longitude) that can be characterized by an integer value.
-- For example, the intensity of the display point might be so characterized.
-- It can be instantiated for any desired range of values (which would 
-- correspond to the range accepted by the display device).


private 

generic               

   type Display_Value is range <>;  -- Any display feature that is 
                                    -- represented by an integer.

package CA11016_0.CA11016_1 is              

   function Get_Display_Value (Lat  : Latitude;
                               Long : Longitude;
                               Map  : Map_Type) return Display_Value;

end CA11016_0.CA11016_1;


     --==================================================================--


package body CA11016_0.CA11016_1 is              

   function Get_Display_Value (Lat  : Latitude;
                               Long : Longitude;
                               Map  : Map_Type) 
     return Display_Value is
   begin
      case Get_Physical_Feature (Lat, Long, Map) is
                                          -- Parent's operation,
           when Forest => return (Display_Value'first);
                                          -- Parent's type.
           when Desert => return (Display_Value'last);
                                          -- Parent's type.
           when others => return 
                            ( (Display_Value'last - Display_Value'first) / 2 );
                                          -- NOTE: Results are truncated.
      end case;

   end Get_Display_Value;

end CA11016_0.CA11016_1;


     --==================================================================--

-- Map display operation, public child of physical map.

package CA11016_0.CA11016_2 is              

   -- Super-duper Ultra Geographic Display Device (SDUGD) can display 
   -- geographic locations with light intensity values ranging from 1 to 7.

   type Display_Val is range 1 .. 7;

   type Device_Color is (Brown, Blue, Green);

   type IO_Packet is
      record
         Lat       : Latitude;       -- Parent's type.
         Long      : Longitude;      -- Parent's type.
         Color     : Device_Color;
         Intensity : Display_Val;
      end record;

   procedure Data_For_SDUGD (Lat           : in     Latitude;
                             Long          : in     Longitude;
                             Output_Packet : in out IO_Packet);

end CA11016_0.CA11016_2;

     --==================================================================--


with CA11016_0.CA11016_1;          -- Private generic sibling.
pragma Elaborate (CA11016_0.CA11016_1);

package body CA11016_0.CA11016_2 is              

   -- Declare instance of the private generic sibling for 
   -- an integer type that represents color intensity.

   package SDUGD is new CA11016_0.CA11016_1 (Display_Val);

   procedure Data_For_SDUGD (Lat           : in     Latitude;
                             Long          : in     Longitude;
                             Output_Packet : in out IO_Packet) is

   -- Simulates sending control information to a display device.
   -- Control information consists of latitude, longitude, a
   -- color, and an intensity.

   begin
      case Get_Physical_Feature (Lat, Long, Basic_Map) is
                                           -- Parent's operation.
         when Water  => Output_Packet.Color     := Blue;
                        Output_Packet.Intensity := SDUGD.Get_Display_Value 
                                                   (Lat, Long, Basic_Map);
                                           -- Sibling's operation.
         when Forest => Output_Packet.Color     := Green;
                        Output_Packet.Intensity := SDUGD.Get_Display_Value 
                                                   (Lat, Long, Basic_Map);
                                           -- Sibling's operation.
         when others => Output_Packet.Color     := Brown;
                        Output_Packet.Intensity := SDUGD.Get_Display_Value 
                                                   (Lat, Long, Basic_Map);
                                           -- Sibling's operation.
       end case;

   end Data_For_SDUGD;

end CA11016_0.CA11016_2;

     --==================================================================--

with CA11016_0.CA11016_2;            -- Map display device operation,
                                     -- implicitly withs parent, physical map
                                     -- application.

use CA11016_0.CA11016_2;             -- Allows direct visibility to the simple
                                     -- name of CA11016_0.CA11016_2.

with Report;

procedure CA11016 is

   TC_Packet : IO_Packet;

begin 

   Report.Test ("CA11016", "Check that body of a public child package can " &
                           "use its sibling private generic package "       &
                           "declarations and operations");

-- Simulate control information at coordinates 3 and 7 of the
-- basic map for the SDUGD.
         
         Water_Display_Subtest:
         begin
            TC_Packet.Lat  := 3;
            TC_Packet.Long := 7;

            -- Build color and light intensity of the basic map at 
            -- latitude 3 and longitude 7.

            Data_For_SDUGD (TC_Packet.Lat, TC_Packet.Long, TC_Packet);

            if ( (TC_Packet.Color     /= Blue) or
                 (TC_Packet.Intensity /= 3) ) then
                Report.Failed ("Map display device contains " &
                               "incorrect values for water subtest");
            end if;

         end Water_Display_Subtest;

-- Simulate control information at coordinates 2 and 1 of the
-- basic map for the SDUGD.
         
         Desert_Display_Subtest:
         begin
            TC_Packet.Lat  := 9;
            TC_Packet.Long := 2;

            -- Build color and light intensity of the basic map at 
            -- latitude 9 and longitude 2.

            Data_For_SDUGD (TC_Packet.Lat, TC_Packet.Long, TC_Packet);

            if ( (TC_Packet.Color     /= Brown) or
                 (TC_Packet.Intensity /= 7) ) then
                Report.Failed ("Map display device contains " &
                               "incorrect values for desert subtest");
            end if;

         end Desert_Display_Subtest;

-- Simulate control information at coordinates 8 and 4 of the
-- basic map for the SDUGD.
         
         Forest_Display_Subtest:
         begin
            TC_Packet.Lat  := 8;
            TC_Packet.Long := 4;

            -- Build color and light intensity of the basic map at 
            -- latitude 8 and longitude 4.

            Data_For_SDUGD (TC_Packet.Lat, TC_Packet.Long, TC_Packet);

            if ( (TC_Packet.Color     /= Green) or
                 (TC_Packet.Intensity /= 1) ) then
                Report.Failed ("Map display device contains " &
                               "incorrect values for forest subtest");
            end if;

         end Forest_Display_Subtest;

   Report.Result;

end CA11016;
